#!/usr/local/bin/perl

sub ascore_3_fosforilaciones{
	my $peptido=$_[0];			#en formato [styuv]
	my $precision=$_[1];		#en unidades m/z
	my $masses=$_[2];			#referencia a array de masas
	my $intensities=$_[3];	#referencia a array intensidades
	my $z=$_[4];				#carga
	my $limit_mz_sup=$_[5];
	my $limit_mz_inf=$_[6];
	#print "Ascore 2 fosfos\n";
	my @masas=split /\|/,$masses;
	my @intensidades=split /\|/,$intensities;


	my @peptidos_posibles=peptide_collection($peptido);
	#foreach(@peptidos_posibles){
		#print "\t\t",$_,"\n";
	#}



	#Obtencion de los Peptide Scores
	my %peptide_scores;
	my %datos_matches_10_niveles;
	foreach my $pep(@peptidos_posibles){
		my %fragmentos_teoricos= %{prever_fragmentos($pep,$z,$limit_mz_sup,$limit_mz_inf)};
		$datos_matches_10_niveles{$pep}=matches_10niveles_series_yb_completas(\%fragmentos_teoricos,\@masas,\@intensidades,$precision,$pep);
	}

	my %weigths=(1=>0.5, 2=>0.75, 3=>1, 4=>1, 5=>1, 6=>1, 7=>0.75, 8=>0.5, 9=>0.25,	10=>0.25);
	my $suma_niveles=7;	#suma de 0.5+0.75+1+1+1+1+0.75+0.5+0.25+0.25


	foreach my $pep(keys %datos_matches_10_niveles){
		my $suma_datos_matches=0;
		my $peptide_score=0;
		for (my $i=1;$i<11;$i++){
			$peptide_score=$peptide_score+($weigths{$i}*$datos_matches_10_niveles{$pep}{$i}{score}/$suma_niveles);
			$datos_matches_10_niveles{$pep}{$i}{score_ponderado}=($weigths{$i}*$datos_matches_10_niveles{$pep}{$i}{score}/$suma_niveles);
		}
		$peptide_scores{$pep}=$peptide_score;
	}

	#Ordeno peptidos segun Peptide score
	my @peptidos_con_peptides_scores_ordenados=sort {$peptide_scores{$b} <=> $peptide_scores{$a}} keys %peptide_scores;
	my $p1=$peptidos_con_peptides_scores_ordenados[0];

	#Convierto peptidos en formato [styuv] segun se vaya necesitando

	#Detecto puntos de modificacion
	my @p_trozos_peptido_1= split //,conversion_styuv($p1);
	my $f1=0;
	my $f2=0;
	my $f3=0;
	for(my $i=0;$i<$#p_trozos_peptido_1+1;$i++){
		if($p_trozos_peptido_1[$i]=~/[styuv]/){
			my $punto=1+$i;
			if($f2){
				$f3=$punto;
			}
			elsif($f1){
				$f2=$punto;
			}
			else{
				$f1=$punto;
			}
		}
	}


	#Encuentro Peptidos-2 para cada modificacion
	#Los peptidos-2 se escogen con este criterio: se busca un peptido con el mayor peptide-score posible y que
	#	cumpla la condicion que el p1 NO este modificado y que los otros p1(con 3 modificaciones, para el caso de
	# 	buscar para f1, el p1 de f2 y el p1 de f3) SI esten modificados.
	my $peptido2_f1;
	my $peptido2_f2;
	my $peptido2_f3;
	for (my $i=1;$i<$#peptidos_con_peptides_scores_ordenados+1;$i++){
		my @p_trozos_peptido_x=split //,conversion_styuv($peptidos_con_peptides_scores_ordenados[$i]);
		if(($p_trozos_peptido_x[(-1+$f1)]=~/[A-Z]/)and($p_trozos_peptido_x[(-1+$f2)]=~/[a-z]/)and($p_trozos_peptido_x[(-1+$f3)]=~/[a-z]/)){
			$peptido2_f1=$peptidos_con_peptides_scores_ordenados[$i];
			last;
		}
	}
	for (my $i=1;$i<$#peptidos_con_peptides_scores_ordenados+1;$i++){
		my @p_trozos_peptido_x=split //,conversion_styuv($peptidos_con_peptides_scores_ordenados[$i]);
		if(($p_trozos_peptido_x[(-1+$f2)]=~/[A-Z]/)and($p_trozos_peptido_x[(-1+$f1)]=~/[a-z]/)and ($p_trozos_peptido_x[(-1+$f3)]=~/[a-z]/)){
			$peptido2_f2=$peptidos_con_peptides_scores_ordenados[$i];
			last;
		}
	}
	for (my $i=1;$i<$#peptidos_con_peptides_scores_ordenados+1;$i++){
		my @p_trozos_peptido_x=split //,conversion_styuv($peptidos_con_peptides_scores_ordenados[$i]);
		if(($p_trozos_peptido_x[(-1+$f3)]=~/[A-Z]/)and($p_trozos_peptido_x[(-1+$f1)]=~/[a-z]/)and ($p_trozos_peptido_x[(-1+$f2)]=~/[a-z]/)){
			$peptido2_f3=$peptidos_con_peptides_scores_ordenados[$i];
			last;
		}
	}


	#Obtengo niveles maxima diferencia entre Peptide Scores (P1 respecto a peptido2_f1, peptido2_f2 y peptido2_f3)
	my $nivel_maxima_diferencia1=0;
	my $difss1=0;
	my $nivel_maxima_diferencia2=0;
	my $difss2=0;
	my $nivel_maxima_diferencia3=0;
	my $difss3=0;
	{
		for(my $i=1;$i<11;$i++){
			my $dif= $datos_matches_10_niveles{$p1}{$i}{score}-$datos_matches_10_niveles{$peptido2_f1}{$i}{score};
			if($dif>$difss1){
				$difss1=$dif;
				$nivel_maxima_diferencia1=$i;
			}
		}
		if($nivel_maxima_diferencia1==0){
			$nivel_maxima_diferencia1=5;#Esto ocurre cuando el pep1 y el pep2 son identicos; uso el 5 de forma arbitraria
		}
		for(my $i=1;$i<11;$i++){
			my $dif= $datos_matches_10_niveles{$p1}{$i}{score}-$datos_matches_10_niveles{$peptido2_f2}{$i}{score};
			if($dif>$difss2){
				$difss2=$dif;
				$nivel_maxima_diferencia2=$i;
			}
		}
		if($nivel_maxima_diferencia2==0){
			$nivel_maxima_diferencia2=5;#Esto ocurre cuando los scores del pep1 y el pep2 son identicos; uso el 5 de forma arbitraria
		}
		for(my $i=1;$i<11;$i++){
			my $dif= $datos_matches_10_niveles{$p1}{$i}{score}-$datos_matches_10_niveles{$peptido2_f3}{$i}{score};
			if($dif>$difss3){
				$difss3=$dif;
				$nivel_maxima_diferencia1=$i;
			}
		}
		if($nivel_maxima_diferencia3==0){
			$nivel_maxima_diferencia3=5;#Esto ocurre cuando el pep1 y el pep3 son identicos; uso el 5 de forma arbitraria
		}
	}


	#Obtengo fragmentos dentro de los intervalos adecuados
		#1#Encuentro puntos complementarios a las f1,f2 y f3 en cada peptido
		#	Por punto complementario se entiende al aminoacido que este modificado en p2 pero NO en p1
		my @p_trozos_peptido_2f1= split //,conversion_styuv($peptido2_f1);
		my @p_trozos_peptido_2f2= split //,conversion_styuv($peptido2_f2);
		my @p_trozos_peptido_2f3= split //,conversion_styuv($peptido2_f3);
		my $aa_complement_1;
		for(my $i=0;$i<$#p_trozos_peptido_2f1+1;$i++){
			if($p_trozos_peptido_2f1[$i]=~/[a-z]/){
				unless(((1+$i)==$f2)or((1+$i)==$f3)){
					$aa_complement_1=1+$i;
				}
			}
		}
		my $aa_complement_2;
		for(my $i=0;$i<$#p_trozos_peptido_2f2+1;$i++){
			if($p_trozos_peptido_2f2[$i]=~/[a-z]/){
				unless(((1+$i)==$f1)or((1+$i)==$f3)){
					$aa_complement_2=1+$i;
				}
			}
		}
		my $aa_complement_3;
		for(my $i=0;$i<$#p_trozos_peptido_2f3+1;$i++){
			if($p_trozos_peptido_2f3[$i]=~/[a-z]/){
				unless(((1+$i)==$f1)or((1+$i)==$f2)){
					$aa_complement_3=1+$i;
				}
			}
		}



		#2#Ordeno los puntos que marcan los intervalos adecuados
		#	Esto significa que ordeno los pares f1-aa_complement1, pares f2-aa_complement2 y
		#	pares f3-aa_complement3 como pares menor-mayor (sea cual sea el de p1 y p2)

			my ($punto11,$punto12,$punto21,$punto22,$punto31,$punto32);
			if($f1>$aa_complement_1){
				$punto11=$aa_complement_1;
				$punto12=$f1;
			}
			elsif($f1<$aa_complement_1){
				$punto12=$aa_complement_1;
				$punto11=$f1;
			}
			else{
				print "errorrrrrrrrrrrrrrr!!!!\n";
			}

			if($f2>$aa_complement_2){
				$punto21=$aa_complement_2;
				$punto22=$f2;
			}
			elsif($f2<$aa_complement_2){
				$punto22=$aa_complement_2;
				$punto21=$f2;
			}
			else{
				print "errorrrrrrrrrrrrrrr!!!!\n";
			}
			if($f3>$aa_complement_3){
				$punto31=$aa_complement_3;
				$punto32=$f3;
			}
			elsif($f3<$aa_complement_3){
				$punto32=$aa_complement_3;
				$punto31=$f3;
			}
			else{
				print "errorrrrrrrrrrrrrrr!!!!\n";
			}

		#print conversion_styuv($p1),"\n\n";
		#print "pep2_f1: ",conversion_styuv($peptido2_f1),"\n";
		#print "max diff 1: ",$nivel_maxima_diferencia1,"\n";
		#print "punto complementario f1: ",$aa_complement_1,"\n";
		#print "punto 11: $punto11 , punto 12: $punto12 \n";
		#print "pep2_f2: ",conversion_styuv($peptido2_f2),"\n";
		#print "max diff 2: ",$nivel_maxima_diferencia2,"\n";
		#print "punto complementario f2: ",$aa_complement_2,"\n";
		#print "punto 21: $punto21 , punto 22: $punto22 \n";
		#print "pep2_f3: ",conversion_styuv($peptido2_f3),"\n";
		#print "max diff 3: ",$nivel_maxima_diferencia3,"\n";
		#print "punto complementario f3: ",$aa_complement_3,"\n";
		#print "punto 31: $punto31 , punto 32: $punto32 \n";
		#print "------------------------------------------------\n\n";
		#return;

		#3#Calculo fragmentos
		#Fragmentos para fosforilacion 1
		my %fragmentos_p1_1=%{prever_fragmentos($p1,$z,$limit_mz_sup,$limit_mz_inf)};
		%fragmentos_p1_1=%{tratamiento_fragmentos(conversion_styuv($p1),\%fragmentos_p1_1,$punto11,$punto12)};
		my %fragmentos_p1_2=%{prever_fragmentos($peptido2_f1,$z,$limit_mz_sup,$limit_mz_inf)};
		%fragmentos_p1_2=%{tratamiento_fragmentos(conversion_styuv($peptido2_f1),\%fragmentos_p1_2,$punto11,$punto12)};
		#Fragmentos para fosforilacion 2
		my %fragmentos_p2_1=%{prever_fragmentos($p1,$z,$limit_mz_sup,$limit_mz_inf)};
		%fragmentos_p2_1=%{tratamiento_fragmentos(conversion_styuv($p1),\%fragmentos_p2_1,$punto21,$punto22)};
		my %fragmentos_p2_2=%{prever_fragmentos($peptido2_f2,$z,$limit_mz_sup,$limit_mz_inf)};
		%fragmentos_p2_2=%{tratamiento_fragmentos(conversion_styuv($peptido2_f2),\%fragmentos_p2_2,$punto21,$punto22)};
		#Fragmentos para fosforilacion 3
		my %fragmentos_p3_1=%{prever_fragmentos($p1,$z,$limit_mz_sup,$limit_mz_inf)};
		%fragmentos_p3_1=%{tratamiento_fragmentos(conversion_styuv($p1),\%fragmentos_p3_1,$punto31,$punto32)};
		my %fragmentos_p3_2=%{prever_fragmentos($peptido2_f3,$z,$limit_mz_sup,$limit_mz_inf)};
		%fragmentos_p3_2=%{tratamiento_fragmentos(conversion_styuv($peptido2_f3),\%fragmentos_p3_2,$punto31,$punto32)};



		##Obtengo datos-ascore: con matches de los fragmentos site-determining
		my $datos_ascore_p1_1=matches_ascore(\%fragmentos_p1_1,\@masas,\@intensidades,$precision,$p1);
		my $datos_ascore_p1_2=matches_ascore(\%fragmentos_p1_2,\@masas,\@intensidades,$precision,$peptido2_f1);

		my $datos_ascore_p2_1=matches_ascore(\%fragmentos_p2_1,\@masas,\@intensidades,$precision,$p1);
		my $datos_ascore_p2_2=matches_ascore(\%fragmentos_p2_2,\@masas,\@intensidades,$precision,$peptido2_f2);

		my $datos_ascore_p3_1=matches_ascore(\%fragmentos_p3_1,\@masas,\@intensidades,$precision,$p1);
		my $datos_ascore_p3_2=matches_ascore(\%fragmentos_p3_2,\@masas,\@intensidades,$precision,$peptido2_f3);

		#print Dumper $datos_ascore_p1_1;


		#print $#{${$datos_ascore_p1_1}{$nivel_maxima_diferencia1}{tags_match_intervalo}};
		#exit;
		my $matches1_1=1+$#{${$datos_ascore_p1_1}{$nivel_maxima_diferencia1}{tags_match_intervalo}};
		my $matches1_2=1+$#{${$datos_ascore_p1_2}{$nivel_maxima_diferencia1}{tags_match_intervalo}};
		my @array1=keys(%fragmentos_p1_1);
		my $size1=1+$#array1;
		my $proporcion1=$matches1_1."//".$size1." (".$matches1_2.")";

		my $matches2_1=1+$#{${$datos_ascore_p2_1}{$nivel_maxima_diferencia2}{tags_match_intervalo}};
		my $matches2_2=1+$#{${$datos_ascore_p2_2}{$nivel_maxima_diferencia2}{tags_match_intervalo}};
		my @array2=keys(%fragmentos_p2_1);
		my $size2=1+$#array2;
		my $proporcion2=$matches2_1."//".$size2." (".$matches2_2.")";

		my $matches3_1=1+$#{${$datos_ascore_p3_1}{$nivel_maxima_diferencia3}{tags_match_intervalo}};
		my $matches3_2=1+$#{${$datos_ascore_p3_2}{$nivel_maxima_diferencia3}{tags_match_intervalo}};
		my @array3=keys(%fragmentos_p3_1);
		my $size3=1+$#array3;
		my $proporcion3=$matches3_1."//".$size3." (".$matches3_2.")";

		#print "Proporcion1: ",$proporcion1,"\n";
	##	Fosfo1, peptido1

		#if((not defined $datos_ascore{$p1}{$nivel_maxima_diferencia}{score})){
			##print "No definido score p1\n";
			#return ($p1,$nivel_maxima_diferencia,$peptide_scores{$p1},0,$proporcion);
		#}

		#${$datos_ascore_p1_1}{$nivel_maxima_diferencia1}{score};

		my $ascore1=${$datos_ascore_p1_1}{$nivel_maxima_diferencia1}{score}-${$datos_ascore_p1_2}{$nivel_maxima_diferencia1}{score};
		my $ascore2=${$datos_ascore_p2_1}{$nivel_maxima_diferencia2}{score}-${$datos_ascore_p2_2}{$nivel_maxima_diferencia2}{score};
		my $ascore3=${$datos_ascore_p3_1}{$nivel_maxima_diferencia3}{score}-${$datos_ascore_p3_2}{$nivel_maxima_diferencia3}{score};
		#print $p1," -> ";
		#print $ascore1,"\t|\t",$ascore2,"\n";

		my %result;
		my $num_deshidrataciones=0;
		my $pdh=$p1;
			while($pdh=~s/23//){
				$num_deshidrataciones++;
			}
		my $num_fosforilaciones=0;
		my $pph=$p1;
			while($pph=~s/(\(21\)|\(21\,|21\))//){
				$num_fosforilaciones++;
			}

		$result{'phosphorylations'}=$num_fosforilaciones;
		$result{'dehydratations'}=$num_deshidrataciones;
		$result{'peptide'}=$p1;
		$result{'peptide_score'}=$peptide_scores{$p1};
		if($ascore1<0.1){
			$ascore1=0;
		}
		if($ascore2<0.1){
			$ascore2=0;
		}
		if($ascore3<0.1){
			$ascore3=0;
		}
		$result{'ascore'}=[$ascore1,$ascore2,$ascore3];

		return %result;


		#return ($p1,$nivel_maxima_diferencia1." | ".$nivel_maxima_diferencia2." | ".$nivel_maxima_diferencia3,$peptide_scores{$p1},$peptido2_f1."(".$punto11."-".$punto12.")",$peptido2_f2."(".$punto21."-".$punto22.")",$peptido2_f3."(".$punto31."-".$punto32.")",$ascore1,$proporcion1,$ascore2,$proporcion2,$ascore3,$proporcion3);


	#my %fragmentos_p2=%{prever_fragmentos($p2,$z)};
	#%fragmentos_p2=%{tratamiento_fragmentos($p2,\%fragmentos_p2,$punto1,$punto2)};

	#print $p1,"\n";
	#print "\t$peptido2_f1\n";
	#print "\t$peptido2_f2\n";
	#print "n1: $nivel_maxima_diferencia1\n";
	#print "Puntos 1: $punto11->$punto12\n";
	#print "n2: $nivel_maxima_diferencia2\n";
	#print "Puntos 1: $punto21->$punto22\n\n";

}

